/**
 * 
 */
package baduga.client.Fasada;

import baduga.client.Controler;
import baduga.client.Player_Constans;
import baduga.core.Core_Gui_ErrorWindow;
import baduga.core.Core_JsonDataSchema;
import baduga.core.Core_Messages;

/**
 * @author Janek
 *
 */
public final class FC_GameEnvSwitch {
	
	
	/**
	 * 
	 * Konstruktor
	 */
	public FC_GameEnvSwitch()
	{
		
	}
	
	
	
	/**
	 * 
	 * Zajmuje się obsługa odpowiedzi na ruch gracza (Korzystającego z tego klienta)
	 * 
	 * <pre>
	 * data:
	 * 
	 * 
	 * Args: |
	 * [1]
	 * typ ruchu:
	 * 
	 * 
	 * [0] | D1
	 * false, true  - Powodzenie operacji
	 * 
	 * </pre>
	 * 
	 * @param data
	 */
	public void playerMove(final Core_JsonDataSchema data)
	{
		//Def.
		Object[] resDataD1;
		
		
		resDataD1 = data.getDataD1();

		
		
		//Sprawdzamy stan odpowiedzi
		if((boolean) resDataD1[0])
		{
			//Def.
			Object[][] resDataD2;
			int moveID;
			
			//Init
			moveID 		= data.getArgs()[1];
			resDataD2	= data.getDataD2();
			
			
			
			if(moveID == 1 || moveID == 3 || moveID == 4 || moveID == 6) //Bet, Raise, call, allin
			{
				Player_Constans.setCash(  Core_JsonDataSchema.toInt( resDataD2[0][0] )  );
				Player_Constans.setPlayerBid( Core_JsonDataSchema.toInt( resDataD2[0][1] ) );
				
				Controler.guiTabGame.updatePlayerAction(new int[] {1, 5}, resDataD2[0]);
				
				
				
			}
			else if(moveID == 2) //check
			{
				Controler.guiTabGame.updatePlayerAction(new int[] {3, 5}, resDataD2[0]);
			}
			else if(moveID == 5) //Fold
			{
				Controler.guiTabGame.updatePlayerAction(new int[] {3, 5}, resDataD2[0]);
				
				//Ustawia gracza na obserwatora
				Controler.guiTabGame.setPlayerType(0);
				Controler.guiTabGame.prepareEnviroment();
			}
			else if(moveID == 7) //Dealer
			{
				Controler.guiTabGame.updatePlayerAction(new int[] {3, 5}, resDataD2[0]);
			}
			else if(moveID == 8) //Card, Exchange
			{
				if(resDataD2[0] != null && resDataD2[0].length > 0)
				{
					//Aktualizacja Kart
					Controler.guiTabGame.updateCards( resDataD2[0] );
				}
			}
			
			
		}
		else
		{
			//Komunikat błędu
			Core_Gui_ErrorWindow.errorWindow(Core_Messages.getMessage(  Core_JsonDataSchema.toInt(resDataD1[1])  ) , Core_Messages.getMessage(0x0100));
			
			//Odblokowanie GuI
			Controler.guiTabGame.setPlayerMoveEndStatus(0);
			Controler.guiTabGame.prepareEnviroment();
		}
		
		
		
	}
	
	
	
	/**

	 */
	/**
	 * Zajmuje się obsługa informacji z strony serwera na temat ruchów obcych graczy (BroadCast)
	 * 
	 * @param data
	 */
	public void otherPlayerMove(Core_JsonDataSchema data)
	{
		//Def.
		Object[] resData;
		
		//Init
		resData = data.getDataD1();
		
		
		//Sprawdzamy stan odpowiedzi
		if((boolean) resData[0])
		{
			
			//Def.
			int eventID;


			//Init
			/**
			 * 1 - (Start) Ruch gracza (innego) | Start tury x-a
			 * 2 - (Effekt)  Ruch gracza (innego)
			 */
			eventID = data.getArgs()[1];

			
			
			if(eventID == 1) //Początek ruchu gracza X
			{
				Controler.guiTabGame.updatePlayerAction(new int[] {0, Core_JsonDataSchema.toInt( resData[1] ) }, data.getDataD2()[0]);
			}
			else if(eventID == 2) //Koniec + Effekt ruchu gracza x
			{
				Controler.guiTabGame.updatePlayerAction(new int[] {data.getArgs()[2], Core_JsonDataSchema.toInt( resData[1] )}, data.getDataD2()[0]);
			}

				
			
			
			
		}
		else
		{
			//Komunikat błędu
			Core_Gui_ErrorWindow.errorWindow(Core_Messages.getMessage(  Core_JsonDataSchema.toInt(resData[1])  ) , Core_Messages.getMessage(0x0100));
		}
	}
	
	
	
	
	
	
	/**
	 * Odbiera od Serwera informacje dot. postępu gry
	 * 
	 * @param data
	 */
	public void gameEvent(Core_JsonDataSchema data)
	{
		//Def.
		Object[] resData;
		
		
		resData = data.getDataD1();
		
		
		//Sprawdzamy stan odpowiedzi
		if((boolean) resData[0])
		{
			
			//Def.
			int eventID;
			
			
			
			
			//Init
			eventID = data.getArgs()[1];
			
			
			/**
			 * 
			 * Informuje o postępie gry
			 * 
			 */
			if(eventID == 0)
			{
				//Def.
				int gameStage;
				
				
				
				/**
				 * 0 - Rozpoczęcie gry
				 * 1 - Wybór Dealera
				 * 2 - Licytacja
				 * 3 - Wynik licytacji
				 * 4 - Wymiana Kart
				 * 5 - Koniec gry
				 * 
				 */
				gameStage = Core_JsonDataSchema.toInt( resData[1] );
				
				if(gameStage == 0) //Rozpoczęcie gry
				{
					Controler.guiTabGame.setGameStart(true);
					Controler.guiTabGame.prepareEnviroment();
				}
				else if(gameStage == 1) //WybórDealera
				{
					Controler.guiTabGame.updateStatusLabel((String) resData[2], 1);
					Controler.guiTabGame.updateStatusLabel( Core_JsonDataSchema.toIntStr(resData[3]), 0);
					
				}
				else if(gameStage == 2) //Licytacja
				{
					Controler.guiTabGame.setGameState(4);
					//TODO: Dopisać coś odkrywczego
				}
				else if(gameStage == 3) //WymianaKart
				{
					Controler.guiTabGame.updateCards( data.getDataD2()[0] );
				}
				else if(gameStage == 4) //WynikLicytacji
				{
					//TODO: Dopisać coś odkrywczego
				}
				else if(gameStage == 5)
				{
					Controler.guiTabGame.setPlayerMoveEndStatus(1);
					Controler.guiTabGame.setGameState(4);
					//TODO: Okno z pktami?!
					//data.getDataD2()[0]
				}
				
				//Append do GameLoga
				Controler.guiTabGame.apendNewMessage( new int[] {2, -1}, 
					Controler.guiTabGame.moveTranslator(new Integer[] {
						Core_JsonDataSchema.toInt(resData.length - 2),
						Core_JsonDataSchema.toInt(resData.length - 1)
					}) 
				);
				
				
			}
			else if(eventID == 1) //Rucha gracza + zezwolenia
			{
				//Def.
				int movieID;
				
				/**
				 * 0 - Dealer
				 * 1 - WymianaKart
				 * 2 - Ruch
				 * 3 - Fold by Timeout
				 * 
				 */
				movieID = Core_JsonDataSchema.toInt( resData[1] );
				
				switch(movieID)
				{
				
					case 0: //Dealer
						Controler.guiTabGame.setPlayerMoveEndStatus(0);
						Controler.guiTabGame.setGameState(3);
					break;
					
					case 1: //WymianaKart
						Controler.guiTabGame.setPlayerMoveEndStatus(0);
						Controler.guiTabGame.setGameState(2);
					break;
					
					case 2: //Ruch
						Controler.guiTabGame.setPlayerMoveEndStatus(0);
						Controler.guiTabGame.setGameState(2);
					break;
					
					case 3: //Fold by Timeout
						Controler.guiTabGame.setPlayerType(0);
						Controler.guiTabGame.clearPlayerData(5, 1);
					break;
					
					default:
					break;
				}
			}
			
			
			
		}
		else
		{
			//Komunikat błędu
			Core_Gui_ErrorWindow.errorWindow(Core_Messages.getMessage(  Core_JsonDataSchema.toInt(resData[1])  ) , Core_Messages.getMessage(0x0100));
		}
	}
	

}
